package netty.nio.netty.decoder;

import netty.nio.netty.protocol.NotEnoughBytesException;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.frame.FrameDecoder;

public class NettyDecoder<T> extends FrameDecoder {

    StreamDecoder<T> streamDecoder;

    public NettyDecoder(StreamDecoder<T> streamDecoder) {
        this.streamDecoder = streamDecoder;
    }

    @Override
    protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer channelBuffer) throws Exception {

        int readableBytes = channelBuffer.readableBytes();

        // Пометим текущую позицию, пока не прочитаем количество доступных байт.
        // Если в буфере еще не достаточно байт для сообщения
        // Мы сбросим позицию буфера на эту метку и начнем сначала
        channelBuffer.markReaderIndex();

        try {
            // Инициализация сообщения
            streamDecoder.init( readableBytes );

            // Читаем все байты в сообщение
            while( !streamDecoder.enough() && channelBuffer.readable() ) {
                streamDecoder.addByte( channelBuffer.readByte() );
            }
//            return streamDecoder.decode();
            // Отправляем сообщения в хэндлер
            return streamDecoder.getAddedBytes();
        } catch( NotEnoughBytesException e ) {
            // Не достаточно байтов для чтения, сбрасываем буфер
            System.out.println("Netty Server: Nothing to read");
            channelBuffer.resetReaderIndex();
            return null;
        }
    }
}
